home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 August: Tool Chest / Dev.CD Aug 94.toast / Tool Chest / Games / Game Sample Code / SpriteWorld 1.0b3 / Sources / SpriteLayer.c < prev    next >
Encoding:
Text File  |  1993-06-07  |  7.6 KB  |  305 lines  |  [TEXT/KAHL]

  1. ///--------------------------------------------------------------------------------------
  2. //    SpriteLayer.c
  3. //
  4. //    Created:    Tuesday, October, 1992 at 10:10:06 PM
  5. //    By:        Tony Myles
  6. //
  7. //    Copyright: © 1991-93 Tony Myles, All rights reserved worldwide
  8. //
  9. //    Description:    implementation of the sprite layers
  10. ///--------------------------------------------------------------------------------------
  11.  
  12.  
  13. #ifndef __MEMORY__
  14. #include <Memory.h>
  15. #endif
  16.  
  17. #ifndef __SPRITEWORLDUTILS__
  18. #include <SpriteWorldUtils.h>
  19. #endif
  20.  
  21. #ifndef __SPRITEWORLD__
  22. #include <SpriteWorld.h>
  23. #endif
  24.  
  25. #ifndef __SPRITELAYER__
  26. #include <SpriteLayer.h>
  27. #endif
  28.  
  29. #ifndef __SPRITE__
  30. #include <Sprite.h>
  31. #endif
  32.  
  33.  
  34. ///--------------------------------------------------------------------------------------
  35. //    SWCreateSpriteLayer
  36. ///--------------------------------------------------------------------------------------
  37.  
  38. SW_PASCAL OSErr SWCreateSpriteLayer(
  39.     SpriteLayerPtr *spriteLayerP)
  40. {
  41.     OSErr err;
  42.     SpriteLayerPtr tempSpriteLayerP;
  43.  
  44.     err = noErr;
  45.     *spriteLayerP = NULL;
  46.  
  47.     tempSpriteLayerP = (SpriteLayerPtr)NewPtrClear((Size)sizeof(SpriteLayerRec));
  48.  
  49.     if (tempSpriteLayerP != NULL)
  50.     {
  51.         *spriteLayerP = tempSpriteLayerP;
  52.     }
  53.     else
  54.     {
  55.         err = MemError();
  56.     }
  57.  
  58.     return err;
  59. }
  60.  
  61.  
  62. ///--------------------------------------------------------------------------------------
  63. //    SWDisposeSpriteLayer
  64. ///--------------------------------------------------------------------------------------
  65.  
  66. SW_PASCAL void SWDisposeSpriteLayer(
  67.     SpriteLayerPtr spriteLayerP)
  68. {
  69.     if (spriteLayerP != NULL)
  70.     {
  71.         DisposePtr((Ptr)spriteLayerP);
  72.     }
  73. }
  74.  
  75.  
  76. ///--------------------------------------------------------------------------------------
  77. //    SWAddSprite
  78. ///--------------------------------------------------------------------------------------
  79.  
  80. SW_PASCAL void SWAddSprite(
  81.     SpriteLayerPtr spriteLayerP,
  82.     SpritePtr newSpriteP)
  83. {
  84.     SpritePtr tailSpriteP = spriteLayerP->tailSpriteP;
  85.  
  86.     if (tailSpriteP != NULL)
  87.     {
  88.             // doubly link the new sprite
  89.         tailSpriteP->nextSpriteP = newSpriteP;
  90.         newSpriteP->prevSpriteP = tailSpriteP;
  91.         newSpriteP->nextSpriteP = NULL;
  92.     }    
  93.     else
  94.     {
  95.         newSpriteP->prevSpriteP = NULL;
  96.         newSpriteP->nextSpriteP = NULL;
  97.  
  98.             // make the new sprite the head
  99.         spriteLayerP->headSpriteP = newSpriteP;
  100.     }
  101.  
  102.         // make the new sprite the tail
  103.     spriteLayerP->tailSpriteP = newSpriteP;
  104. }
  105.  
  106.  
  107. ///--------------------------------------------------------------------------------------
  108. //    SWRemoveSprite
  109. ///--------------------------------------------------------------------------------------
  110.  
  111. SW_PASCAL void SWRemoveSprite(
  112.     SpriteLayerPtr spriteLayerP,
  113.     SpritePtr oldSpriteP)
  114. {
  115.         // is this not the tail sprite?
  116.     if (oldSpriteP->nextSpriteP != NULL)
  117.     {
  118.             // link the next sprite to the prev sprite
  119.         oldSpriteP->nextSpriteP->prevSpriteP = oldSpriteP->prevSpriteP;
  120.     }
  121.     else
  122.     {
  123.             // make the prev sprite the tail
  124.         spriteLayerP->tailSpriteP = oldSpriteP->prevSpriteP;
  125.     }
  126.  
  127.         // is this not the head sprite?
  128.     if (oldSpriteP->prevSpriteP != NULL)
  129.     {
  130.             // link the prev sprite to the next sprite
  131.         oldSpriteP->prevSpriteP->nextSpriteP = oldSpriteP->nextSpriteP;
  132.     }
  133.     else
  134.     {
  135.             // make the next sprite the first sprite
  136.         spriteLayerP->headSpriteP = oldSpriteP->nextSpriteP;
  137.     }
  138.  
  139.     oldSpriteP->prevSpriteP = NULL;
  140.     oldSpriteP->nextSpriteP = NULL;
  141. }
  142.  
  143.  
  144. ///--------------------------------------------------------------------------------------
  145. //    SWSwapSprite
  146. ///--------------------------------------------------------------------------------------
  147.  
  148. SW_PASCAL void SWSwapSprite(
  149.     SpriteLayerPtr spriteLayerP,
  150.     SpritePtr srcSpriteP,
  151.     SpritePtr dstSpriteP)
  152. {
  153.     register SpritePtr swapSpriteP;
  154.     
  155.     swapSpriteP = srcSpriteP->nextSpriteP;
  156.     srcSpriteP->nextSpriteP = dstSpriteP->nextSpriteP;
  157.     dstSpriteP->nextSpriteP = swapSpriteP;
  158.  
  159.     swapSpriteP = srcSpriteP->prevSpriteP;
  160.     srcSpriteP->prevSpriteP = dstSpriteP->prevSpriteP;
  161.     dstSpriteP->prevSpriteP = swapSpriteP;
  162.  
  163.     if (srcSpriteP->nextSpriteP == NULL)
  164.     {
  165.         spriteLayerP->tailSpriteP = srcSpriteP;
  166.     }
  167.     else if (srcSpriteP->prevSpriteP == NULL)
  168.     {
  169.         spriteLayerP->headSpriteP = srcSpriteP;
  170.     }
  171.  
  172.     if (dstSpriteP->nextSpriteP == NULL)
  173.     {
  174.         spriteLayerP->tailSpriteP = dstSpriteP;
  175.     }
  176.     else if (dstSpriteP->prevSpriteP == NULL)
  177.     {
  178.         spriteLayerP->headSpriteP = dstSpriteP;
  179.     }
  180. }
  181.  
  182.  
  183. ///--------------------------------------------------------------------------------------
  184. //    SWGetNextSprite
  185. ///--------------------------------------------------------------------------------------
  186.  
  187. SW_PASCAL SpritePtr SWGetNextSprite(
  188.     SpriteLayerPtr spriteLayerP,
  189.     SpritePtr curSpriteP)
  190. {
  191.     return (curSpriteP == NULL) ? spriteLayerP->headSpriteP : curSpriteP->nextSpriteP;
  192. }
  193.  
  194.  
  195. ///--------------------------------------------------------------------------------------
  196. //    SWLockSpriteLayer
  197. ///--------------------------------------------------------------------------------------
  198.  
  199. SW_PASCAL void SWLockSpriteLayer(
  200.     SpriteLayerPtr spriteLayerP)
  201. {
  202.     SpritePtr curSpriteP;
  203.  
  204.     curSpriteP = spriteLayerP->headSpriteP;
  205.  
  206.     while (curSpriteP != NULL)
  207.     {
  208.         SWLockSprite(curSpriteP);
  209.  
  210.         curSpriteP = curSpriteP->nextSpriteP;
  211.     }
  212. }
  213.  
  214.  
  215. ///--------------------------------------------------------------------------------------
  216. //    SWUnlockSpriteLayer
  217. ///--------------------------------------------------------------------------------------
  218.  
  219. SW_PASCAL void SWUnlockSpriteLayer(
  220.     SpriteLayerPtr spriteLayerP)
  221. {
  222.     SpritePtr curSpriteP;
  223.  
  224.     curSpriteP = spriteLayerP->headSpriteP;
  225.  
  226.     while (curSpriteP != NULL)
  227.     {
  228.         SWUnlockSprite(curSpriteP);
  229.  
  230.         curSpriteP = curSpriteP->nextSpriteP;
  231.     }
  232. }
  233.  
  234.  
  235. ///--------------------------------------------------------------------------------------
  236. //    SWCollideSpriteLayer
  237. ///--------------------------------------------------------------------------------------
  238.  
  239. SW_PASCAL void SWCollideSpriteLayer(
  240.     SpriteLayerPtr srcSpriteLayerP,
  241.     SpriteLayerPtr dstSpriteLayerP)
  242. {
  243.     SpritePtr srcSpriteP;
  244.     SpritePtr dstSpriteP;
  245.     SpritePtr nextSrcSpriteP;
  246.     SpritePtr nextDstSpriteP;
  247.     Rect sectRect;
  248.  
  249.     srcSpriteP = srcSpriteLayerP->headSpriteP;
  250.  
  251.     while (srcSpriteP != NULL)
  252.     {
  253.         nextSrcSpriteP = srcSpriteP->nextSpriteP;
  254.         dstSpriteP = dstSpriteLayerP->headSpriteP;
  255.  
  256.         while (dstSpriteP != NULL)
  257.         {
  258.             nextDstSpriteP = dstSpriteP->nextSpriteP;
  259.  
  260.             if (srcSpriteP != dstSpriteP)
  261.             {
  262.                     // are the sprite’s rectangles overlapping?
  263.                 if (!((srcSpriteP->destFrameRect.top >= dstSpriteP->destFrameRect.bottom) ||
  264.                          (srcSpriteP->destFrameRect.bottom <= dstSpriteP->destFrameRect.top) ||
  265.                          (srcSpriteP->destFrameRect.left >= dstSpriteP->destFrameRect.right) ||
  266.                          (srcSpriteP->destFrameRect.right <= dstSpriteP->destFrameRect.left)))
  267.                 {
  268.                         // call the source sprite’s collision routine
  269.                     if (srcSpriteP->spriteCollideProc != NULL)
  270.                     {
  271.                         sectRect.left = (srcSpriteP->destFrameRect.left > dstSpriteP->destFrameRect.left)
  272.                                             ? srcSpriteP->destFrameRect.left : dstSpriteP->destFrameRect.left;
  273.                         sectRect.top = (srcSpriteP->destFrameRect.top > dstSpriteP->destFrameRect.top)
  274.                                             ? srcSpriteP->destFrameRect.top : dstSpriteP->destFrameRect.top;
  275.                         sectRect.right = (srcSpriteP->destFrameRect.right < dstSpriteP->destFrameRect.right)
  276.                                                 ? srcSpriteP->destFrameRect.right : dstSpriteP->destFrameRect.right;
  277.                         sectRect.bottom = (srcSpriteP->destFrameRect.bottom < dstSpriteP->destFrameRect.bottom)
  278.                                                 ? srcSpriteP->destFrameRect.bottom : dstSpriteP->destFrameRect.bottom;
  279.  
  280.                         (*srcSpriteP->spriteCollideProc)(srcSpriteP, dstSpriteP, §Rect);
  281.                     }
  282.                 }
  283.             }
  284.  
  285.             if (nextDstSpriteP != NULL)
  286.             {
  287.                 dstSpriteP = nextDstSpriteP;
  288.             }
  289.             else
  290.             {
  291.                 dstSpriteP = dstSpriteP->nextSpriteP;
  292.             }
  293.         }
  294.  
  295.         if (nextSrcSpriteP != NULL)
  296.         {
  297.             srcSpriteP = nextSrcSpriteP;
  298.         }
  299.         else
  300.         {
  301.             srcSpriteP = srcSpriteP->nextSpriteP;
  302.         }
  303.     }
  304. }
  305.